home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / lib-old / cmpcache.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  2KB  |  66 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. """Efficiently compare files, boolean outcome only (equal / not equal).
  5.  
  6. Tricks (used in this order):
  7.     - Use the statcache module to avoid statting files more than once
  8.     - Files with identical type, size & mtime are assumed to be clones
  9.     - Files with different type or size cannot be identical
  10.     - We keep a cache of outcomes of earlier comparisons
  11.     - We don't fork a process to run 'cmp' but read the files ourselves
  12. """
  13. import os
  14. from stat import *
  15. import statcache
  16. cache = { }
  17.  
  18. def cmp(f1, f2, shallow = 1):
  19.     '''Compare two files, use the cache if possible.
  20.     May raise os.error if a stat or open of either fails.
  21.     Return 1 for identical files, 0 for different.
  22.     Raise exceptions if either file could not be statted, read, etc.'''
  23.     s1 = sig(statcache.stat(f1))
  24.     s2 = sig(statcache.stat(f2))
  25.     if not S_ISREG(s1[0]) or not S_ISREG(s2[0]):
  26.         return 0
  27.     
  28.     if shallow and s1 == s2:
  29.         return 1
  30.     
  31.     if s1[:2] != s2[:2]:
  32.         return 0
  33.     
  34.     key = f1 + ' ' + f2
  35.     if cache.has_key(key):
  36.         (cs1, cs2, outcome) = cache[key]
  37.         if s1 == cs1 and s2 == cs2:
  38.             return outcome
  39.         
  40.     
  41.     outcome = do_cmp(f1, f2)
  42.     cache[key] = (s1, s2, outcome)
  43.     return outcome
  44.  
  45.  
  46. def sig(st):
  47.     '''Return signature (i.e., type, size, mtime) from raw stat data.'''
  48.     return (S_IFMT(st[ST_MODE]), st[ST_SIZE], st[ST_MTIME])
  49.  
  50.  
  51. def do_cmp(f1, f2):
  52.     '''Compare two files, really.'''
  53.     bufsize = 8 * 1024
  54.     fp1 = open(f1, 'rb')
  55.     fp2 = open(f2, 'rb')
  56.     while None:
  57.         b1 = fp1.read(bufsize)
  58.         b2 = fp2.read(bufsize)
  59.         if b1 != b2:
  60.             return 0
  61.         
  62.         if not b1:
  63.             return 1
  64.             continue
  65.  
  66.